home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / comm / mmgr / MM_FbMRMv12.lha / MM / Rexx / MM_FbMReq.rexx
OS/2 REXX Batch file  |  1996-09-01  |  35KB  |  914 lines

  1. /*
  2.  
  3.     File-by-Mail-Request Server
  4.  
  5.     © 1996 by Sebastian Bleikamp.
  6.     All rights reserved.
  7.  
  8.     version 1.2
  9.  
  10.  
  11. --------\
  12. History: ----------------------------------------------------------------
  13. --------/
  14.  
  15. SINCE v 0.7:
  16.  
  17.     ->  !!!! New index format: !!!!
  18.         Name|Type|Path|Level|Desc
  19.         (Before: Type|Name| ... )
  20.  
  21.     ->  Functions ok:
  22.         HELP
  23.         LIST
  24.         SCAN
  25.         SEARCH
  26.         GET
  27.  
  28.     ->  EMail Support !!!!!
  29.     ->  Passwd Support !!!
  30.  
  31.  
  32. SINCE v 0.8:
  33.  
  34.     -> Replace Patterns !!!
  35.        !! Other filenames for text files !!
  36.  
  37.  
  38. SINCE v 0.9:
  39.  
  40.     -> Much more replace patterns !!
  41.        Now all message infos are avaible !
  42.  
  43.     -> UUencode: MAXSIZE added !!
  44.     -> Textfile: MAXSIZE added !!
  45.  
  46.  
  47. SINCE v 0.10:
  48.  
  49.     -> Filelist will be splittet, too !
  50.  
  51.  
  52. SINCE v 0.11:
  53.  
  54.     -> some more replace patterns ...
  55.  
  56.     -> now there are two different values for text and binary max.
  57.        message size.
  58.  
  59.     -> Wrong-Password function improved: Message will be sent back.
  60.  
  61.     -> Maany bugfixes.
  62.  
  63.  
  64. SINCE v 0.12:
  65.  
  66.     -> Now with a configfile !!!
  67.     -> Configureable subjects.
  68.  
  69.  
  70. SINCE v 1.0(a):
  71.  
  72.     -> new option: #DONEFLAGS
  73.        you can specify the flags a message gets after processing.
  74.  
  75.     -> new index format: group|name|...
  76.  
  77.     -> added group features ...
  78.  
  79.     -> AmigaDOS Patterns can be used for searching ...
  80.  
  81.     -> new %LIST command: %LIST <group-pattern>
  82.  
  83.  
  84. SINCE v 1.1:
  85.  
  86.     -> Filesize was added to the index.
  87.        Group|Name|Type|Path|Size|Level|Desc
  88.        {FSIZE} pattern added.
  89.  
  90.     -> added .readme files ...
  91.     -> now a textfile (.readme) will be send before the file.
  92.  
  93.     -> configureable flags for message searching ...
  94.  
  95.     -> now with %HOLD function !
  96.  
  97. ---------------------------------------------------------------------------
  98. */
  99.  
  100.  
  101. address 'MAILMANAGER'
  102.  
  103.  
  104. call Init()
  105. call Read_Index()
  106.  
  107. call Get_The_List()
  108. call Check_Passwords()
  109.  
  110. call Do_Requests()
  111.  
  112.  
  113. call ByeBye(0,)
  114. exit 0
  115.  
  116.  
  117.  
  118. /*---------------------------------------------------------------------------*\
  119. |*  Standart Functions:                                                      *|
  120. \*---------------------------------------------------------------------------*/
  121.  
  122.  
  123. Init:
  124.     system.     = 0
  125.     ToDoList.  = 0
  126.     IndexStem. = 0
  127.     FileStem.  = 0
  128.  
  129.     call LogInit()
  130.     call LogHeader()
  131.  
  132.     system.configfile           = 'MM:Config/MM_FbMRM.cfg'
  133.     call Read_Config()
  134.  
  135. return
  136.  
  137.  
  138. ByeBye: procedure expose system.
  139.     parse arg ecode ',;' estring
  140.     if estring~='' then do
  141.         say estring
  142.         call Log(estring',;2')
  143.     end
  144.     call LogFooter()
  145.     call LogQuit()
  146.     exit ecode
  147. return
  148.  
  149.  
  150. /* Log-Funktions: ---------------------------------------------------------*/
  151.  
  152. LogInit:
  153.         system.prg.name         = 'MM_FbMReqManager'
  154.         system.prg.ver          = '1.2'
  155.         system.prg.id           = system.prg.name 'v'system.prg.ver
  156.         system.prg.stdlev       = 3
  157.         system.mm.logpre        = getclip('MM_LogPre')
  158.         system.prg.logpre       = system.mm.logpre'|'
  159.         call                    setclip('MM_LogPre', system.prg.logpre)
  160. return
  161.  
  162. LogQuit:
  163.         arg rc
  164.         call setclip('MM_LogPre', system.mm.logpre)
  165.         MM_CloseLog
  166. exit rc
  167.  
  168. LogHeader: PROCEDURE Expose system.
  169.         call Log(',;2,;/')
  170.         call Log('***' system.prg.id 'started ***,;2,;+')
  171.         call Log(',;2')
  172. return
  173.  
  174. LogFooter: procedure Expose system.
  175.         call Log(',;2')
  176.         call Log('***' system.prg.id 'ended ***,;2,;+')
  177.         call Log(',;2,;\')
  178. return
  179.  
  180. Log: procedure Expose system.
  181.         parse arg text ',;' level ',;' pre
  182.         tmp         = word('PRG MM', (pre~='')+1)
  183.         text        = system.tmp.logpre || pre' 'text
  184.         if level='' then level=system.prg.stdlev
  185.         MM_WriteLog 'text' level
  186. return
  187.  
  188.  
  189.  
  190.  
  191. /*---------------------------------------------------------------------------*\
  192. |*  Program Functions:                                                       *|
  193. \*---------------------------------------------------------------------------*/
  194.  
  195.  
  196. Get_The_List:  procedure expose system. ToDoList.
  197.     call Log('Searching for new messages ...,;,;+')
  198.     ToDoList.count=0
  199.     MM_GetAreas 'AreaList' 'MAIL'
  200.     do area = 0 to AreaList.count-1
  201.         MM_SearchMsgs AreaList.area 'MsgList' '#?' '#?' '#?' system.cfg.sflags
  202.         do msg=0 to MsgList.count-1
  203.             MM_ReadMsg AreaList.area MsgList.msg 'MsgStem'
  204.             if (rc~=0) then call ByeBye('100,;***Error: Unable to read message !')
  205.             if (find(upper(system.servername),upper(MsgStem.TO))~=0) then do
  206.                 i = ToDoList.count
  207.                 ToDoList.i.MsgArea          = AreaList.area
  208.                 ToDoList.i.MsgNum           = MsgList.msg
  209.                 ToDoList.i.MsgFrom          = MsgStem.FROM
  210.                 ToDoList.i.MsgFromAddr      = MsgStem.FROMADDR
  211.                 ToDoList.i.MsgSubj          = MsgStem.SUBJ
  212.                 ToDoList.i.Level            = system.cfg.stdlevel
  213.                 ToDoList.i.EMail            = ''
  214.                 do kludge=0 to MsgStem.HEAD.count-1
  215.                     if (pos('REPLYADDR',upper(word(MsgStem.HEAD.kludge,1)))~=0) then do
  216.                         parse var MsgStem.HEAD.kludge pre ' ' ToDoList.i.EMail
  217.                     end
  218.                 end
  219.                 ToDoList.count = i+1
  220.             end
  221.         end
  222.     end
  223.     call Log('... done. Found '||toDoList.count||' message(s) to do.')
  224. return
  225.  
  226.  
  227.  
  228.  
  229. Do_Requests: procedure expose system. IndexStem. FileStem. ToDoList.
  230.     do todo=0 to ToDoList.count-1
  231.         if (TodoList.todo.email~='') then who=ToDoList.todo.email||' ('ToDoList.todo.MsgFrom||')'
  232.         else who=ToDoList.todo.MsgFrom||' ('ToDoList.todo.MsgFromAddr||')'
  233.         call Log()
  234.         call Log('Message from 'who', level '||ToDoList.todo.Level||'.,;,;+')
  235.         MM_ReadMsg ToDoList.todo.MsgArea ToDoList.todo.MsgNum 'MsgStem'
  236.         if (rc~=0) then call ByeBye('100,;***Error: Unable to read message !')
  237.  
  238.         /* create info: */
  239.         system.info.Area        = ToDoList.todo.MsgArea
  240.         system.info.Number      = ToDoList.todo.MsgNum
  241.         system.info.From        = ToDoList.todo.MsgFrom
  242.         system.info.FromAddr    = ToDoList.todo.MsgFromAddr
  243.         system.info.To          = MsgStem.TO
  244.         system.info.ToAddr      = MsgStem.TOADDR
  245.         system.info.Subject     = MsgStem.SUBJ
  246.         system.info.Date        = MsgStem.DATE
  247.         system.info.Flags       = MsgStem.FLAGS
  248.         system.info.Level       = ToDoList.todo.Level
  249.         system.info.EMail       = ToDoList.todo.EMail
  250.         system.info.fromwho         = who
  251.  
  252.         do textcount=0 to MsgStem.TEXT.count-1
  253.             system.info.prc.fgroup = ''
  254.             system.info.prc.fname  = ''
  255.             system.info.prc.ftype  = ''
  256.             system.info.prc.fpath  = ''
  257.             system.info.prc.fsize  = 0
  258.             system.info.prc.flevel = -1
  259.             system.info.prc.fdesc  = ''
  260.             system.info.prc.part      = 0
  261.             system.info.prc.maxpart   = 0
  262.             parse var MsgStem.TEXT.textcount pre '%' keyword ' ' arguments
  263.             select
  264.                 when (pre~='')                  then NOP
  265.                 when (upper(keyword)='HELP')    then call Send_Helpfile(ToDoList.todo.MsgArea',;'ToDoList.todo.MsgFrom',;'ToDoList.todo.MsgFromAddr',;'ToDoList.todo.EMail)
  266.                 when (upper(keyword)='LIST')    then call Send_Filelist(ToDoList.todo.MsgArea',;'ToDoList.todo.MsgFrom',;'ToDoList.todo.MsgFromAddr',;'ToDoList.todo.EMail',;'ToDoList.todo.Level',;'arguments)
  267.                 when (upper(keyword)='GET')     then call Send_File(ToDoList.todo.MsgArea',;'ToDoList.todo.MsgFrom',;'ToDoList.todo.MsgFromAddr',;'ToDoList.todo.EMail',;'ToDoList.todo.Level',;'word(arguments,1))
  268.                 when (upper(keyword)='SCAN')    then call Send_Scan(ToDoList.todo.MsgArea',;'ToDoList.todo.MsgFrom',;'ToDoList.todo.MsgFromAddr',;'ToDoList.todo.EMail',;'ToDoList.todo.Level',;'word(arguments,1))
  269.                 when (upper(keyword)='README')  then call Send_ReadMe(ToDoList.todo.MsgArea',;'ToDoList.todo.MsgFrom',;'ToDoList.todo.MsgFromAddr',;'ToDoList.todo.EMail',;'ToDoList.todo.Level',;'word(arguments,1))
  270.                 when (upper(keyword)='SEARCH')  then call Send_Search(ToDoList.todo.MsgArea',;'ToDoList.todo.MsgFrom',;'ToDoList.todo.MsgFromAddr',;'ToDoList.todo.EMail',;'ToDoList.todo.Level',;'word(arguments,1))
  271.                 when (upper(keyword)='HOLD')    then call Send_Hold(ToDoList.todo.MsgArea',;'ToDoList.todo.MsgFrom',;'ToDoList.todo.MsgFromAddr',;'ToDoList.todo.EMail',;'ToDoList.todo.Level',;'word(arguments,1))
  272.                 otherwise NOP
  273.             end
  274.         end
  275.         MM_EditMsgFlags ToDoList.todo.MsgArea ToDoList.todo.MsgNum 'system.cfg.doneflags'
  276.     end
  277. return
  278.  
  279.  
  280.  
  281.  
  282.  
  283. Send_Helpfile: procedure expose system.
  284.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail
  285.     call Log('-> Sending Helpfile.')
  286.     call Build_MessageBody(system.text.helpfile||',;'||system.tempfile)
  287.     call Send_Msg(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'system.tempfile',;'system.subj.helpfile)
  288.     MM_DeleteFile system.tempfile
  289. return
  290.  
  291.  
  292.  
  293.  
  294.  
  295. Send_Filelist: procedure expose system. IndexStem.
  296.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail ',;' level ',;' searchgroup
  297.     system.info.prc.flevel = level
  298.     if (searchgroup='') then searchgroup = '#?'
  299.     thisgroup = ''
  300.     DummyStem.count=0
  301.     do i=0 to IndexStem.count-1
  302.         if ((IndexStem.i.flevel<=level)&(Check_Pattern(IndexStem.i.fgroup||',;'||searchgroup))) then do
  303.             if (IndexStem.i.fgroup~=thisgroup) then do
  304.                 thisgroup = IndexStem.i.fgroup
  305.                 j=DummyStem.count
  306.                 DummyStem.j = ''; j=j+1
  307.                 DummyStem.j = 'Group: '||thisgroup; j=j+1
  308.                 DummyStem.j = '------';j=j+1
  309.                 DummyStem.count = j
  310.             end
  311.             j = DummyStem.count
  312.             DummyStem.j = '  'IndexStem.i.fname
  313.             do k=0 to (26-(length(DummyStem.j)+length(IndexStem.i.fsize)))
  314.                 DummyStem.j=DummyStem.j||' '
  315.             end
  316.             DummyStem.j=DummyStem.j||' '||IndexStem.i.fsize||'  '||IndexStem.i.fdesc
  317.             DummyStem.count = j+1
  318.         end
  319.     end
  320.  
  321.     i=0; j=0
  322.     do while (i<DummyStem.count)
  323.         anz=0; TextStem.j.count=0
  324.         do while ((anz<system.cfg.txtmaxsize)&(i<DummyStem.count))
  325.             anz = anz + length(DummyStem.i)
  326.             MM_AddToStem 'TextStem.'||j 'DummyStem.'||i
  327.             i=i+1
  328.         end
  329.         j=j+1
  330.     end
  331.     TextStem.count=j
  332.     call Log('-> Sending filelist  ( 'TextStem.count' message(s)).')
  333.     system.info.prc.maxpart = TextStem.count
  334.     do i=0 to TextStem.count-1
  335.         system.info.prc.part = (i+1)
  336.         MM_WriteStem system.tempfile 'TextStem.'||i
  337.         if (rc~=0) then ByeBye('100,;***Error: Unable to write tempfile !!')
  338.         call Build_MessageBody(system.text.filelist||',;'||system.tempfile||',;'||system.tempfile)
  339.         call Send_Msg(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'system.tempfile',;'system.subj.filelist)
  340.         MM_DeleteFile system.tempfile
  341.     end
  342.  
  343. return
  344.  
  345.  
  346.  
  347.  
  348. Send_File: procedure expose system. IndexStem.
  349.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail ',;' level ',;' filename
  350.     system.info.prc.flevel = level
  351.     call Scan_Index(filename',;'level)
  352.     call Check_FileStem_Dupes()
  353.     system.info.prc.fname  = filename
  354.     if (FileStem.count=0) then call Send_FileNotFound(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'filename)
  355.     else do
  356.         do i=0 to Filestem.count-1
  357.             system.info.prc.fgroup = FileStem.i.fgroup
  358.             system.info.prc.ftype  = FileStem.i.ftype
  359.             system.info.prc.fpath  = FileStem.i.fpath
  360.             system.info.prc.fsize  = FileStem.i.fsize
  361.             system.info.prc.flevel = FileStem.i.flevel
  362.             system.info.prc.fdesc  = FileStem.i.fdesc
  363.             select
  364.                 when (upper(FileStem.i.ftype)='FILE') then call Send_BFile(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'filename',;'FileStem.i.fpath)
  365.                 when (upper(FileStem.i.ftype)='TEXT') then call Send_TFile(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'filename',;'FileStem.i.fpath)
  366.                 otherwise ByeBye('200,;***Error: Unknown file type !!')
  367.             end
  368.         end
  369.     end
  370. return
  371.  
  372.  
  373.  
  374.  
  375.  
  376. Send_Scan: procedure expose system. IndexStem.
  377.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail ',;' level ',;' filename
  378.     call Search_Index(filename',;'level)
  379.     DummyStem.count=0
  380.     do i=0 to FileStem.count-1
  381.         j=DummyStem.count
  382.         DummyStem.j = FileStem.i.fname||' '
  383.  
  384.         do k=0 to (26-(length(FileStem.i.fname)+length(FileStem.j.fsize)))
  385.             DummyStem.j = DummyStem.j||' '
  386.         end
  387.         DummyStem.j = DummyStem.j||FileStem.i.fsize||' '||FileStem.i.fgroup||' '
  388.         do k=0 to (10-length(FileStem.i.fgroup))
  389.             DummyStem.j = DummyStem.j||' '
  390.         end
  391.         DummyStem.j = DummyStem.j||FileStem.i.fdesc
  392.         DummyStem.count = j+1
  393.     end
  394.     MM_WriteStem system.tempfile 'DummyStem'
  395.     if (rc~=0) then ByeBye('100,;***Error: Unable to write tempfile !!')
  396.     system.info.prc.fname = filename
  397.     system.info.prc.flevel = level
  398.     call Build_MessageBody(system.text.search||',;'||system.tempfile||',;'||system.tempfile)
  399.     call LOG('-> Scanning for '||filename||'.')
  400.     call Send_Msg(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'system.tempfile',;'system.subj.search)
  401.     MM_DeleteFile system.tempfile
  402. return
  403.  
  404.  
  405.  
  406. Send_ReadMe: procedure expose system. IndexStem.
  407.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail ',;' level ',;' filename
  408.     call Search_Index(filename',;'level)
  409.  
  410.     call LOG('-> Sending readmes for '||filename||'.')
  411.     do i=0 to FileStem.count-1
  412.         system.info.prc.fgroup = FileStem.i.fgroup
  413.         system.info.prc.fname  = FileStem.i.fname
  414.         system.info.prc.ftype  = FileStem.i.ftype
  415.         system.info.prc.fpath  = FileStem.i.fpath
  416.         system.info.prc.fsize  = FileStem.i.fsize
  417.         system.info.prc.flevel = FileStem.i.flevel
  418.         system.info.prc.fdesc  = FileStem.i.fdesc
  419.         system.info.prc.maxpart = 0
  420.         call Send_The_ReadMe(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'FileStem.i.fpath)
  421.     end
  422. return
  423.  
  424.  
  425.  
  426.  
  427.  
  428. Send_Search: procedure expose system. IndexStem.
  429.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail ',;' level ',;' filename
  430.     call Search_Index(filename',;'level)
  431.     call Check_FileStem_Dupes()
  432.     DummyStem.count=0
  433.     do i=0 to FileStem.count-1
  434.         call Send_File(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'level',;'FileStem.i.fname)
  435.     end
  436. return
  437.  
  438.  
  439.  
  440. Send_Hold: procedure expose system. IndexStem.
  441.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail ',;' level ',;' filename
  442.     if (level>=system.cfg.holdlevel) then do
  443.         call Search_Index(filename',;'level)
  444.         call Check_FileStem_Dupes()
  445.         if (FileStem.count=0) then call Send_FileNotFound(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'filename)
  446.         do i=0 to FileStem.count-1
  447.             system.info.prc.fgroup = FileStem.i.fgroup
  448.             system.info.prc.fname  = FileStem.i.fname
  449.             system.info.prc.ftype  = FileStem.i.ftype
  450.             system.info.prc.fpath  = FileStem.i.fpath
  451.             system.info.prc.fsize  = FileStem.i.fsize
  452.             system.info.prc.flevel = FileStem.i.flevel
  453.             system.info.prc.fdesc  = FileStem.i.fdesc
  454.             system.info.prc.maxpart = 0
  455.             readme = Get_ReadMe( FileStem.i.fpath )
  456.             system.info.prc.part = 0
  457.             call Build_MessageBody(system.text.hold||',;'||system.tempfile||',;'||readme)
  458.             call Send_Msg(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'system.tempfile',;'system.subj.hold)
  459.             MM_DeleteFile system.tempfile
  460.             MM_AddToFlow FileStem.i.fpath To_Addr 'HOLD'
  461.         end
  462.     end
  463.     else do
  464.         call Send_FileNotFound(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'filename)
  465.     end
  466. return
  467.  
  468.  
  469.  
  470.  
  471.  
  472. /*---------------------------------------------------------------------------*\
  473. |*  Support Functions:                                                       *|
  474. \*---------------------------------------------------------------------------*/
  475.  
  476.  
  477. Send_BFile: procedure expose system.
  478.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail ',;' filename ',;' filepath
  479.     /* execute uuencode: */
  480.     com = system.uuencode
  481.     com = Replace_String(com||',;'||'{INFILE}'||',;'||filepath)
  482.     com = Replace_String(com||',;'||'{OUTFILE}'||',;'||system.tempfile||'.')
  483.     com = Replace_String(com||',;'||'{MAXSIZE}'||',;'||system.cfg.binmaxsize)
  484.     address command com
  485.     /* Count files: */
  486.     check=1; count=-1
  487.     do while (check~=0)
  488.         count=count+1; drop check
  489.         MM_CRCFile system.tempfile||'.'||(count+1) check
  490.     end
  491.     system.info.prc.maxpart = count
  492.     call Log('-> Sending binary file '||filename||' ('filepath', 'count' message(s)).')
  493.     call Send_The_ReadMe(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'filepath)
  494.     do i=1 to count
  495.         system.info.prc.part = i
  496.         call Build_MessageBody(system.text.sendfile||',;'||system.tempfile||'.'||i||',;'||system.tempfile||'.'||i)
  497.         call Send_Msg(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'system.tempfile||'.'||i||',;'system.subj.sendfile)
  498.         MM_DeleteFile system.tempfile||'.'||i
  499.     end
  500.  
  501. return
  502.  
  503.  
  504.  
  505. Send_TFile: procedure expose system.
  506.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail ',;' filename ',;' filepath
  507.     MM_ReadStem filepath 'DummyStem'
  508.     i=0; j=0
  509.     do while (i<DummyStem.count)
  510.         anz=0; TextStem.j.count=0
  511.         do while ((anz<system.cfg.txtmaxsize)&(i<DummyStem.count))
  512.             anz = anz + length(DummyStem.i)
  513.             MM_AddToStem 'TextStem.'||j 'DummyStem.'||i
  514.             i=i+1
  515.         end
  516.         j=j+1
  517.     end
  518.     TextStem.count=j
  519.  
  520.     call Log('-> Sending textfile '||filename' ('filepath', 'TextStem.count' message(s)).')
  521.     system.info.prc.maxpart = TextStem.count
  522.     call Send_The_ReadMe(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'filepath)
  523.  
  524.     do i=0 to TextStem.count-1
  525.         system.info.prc.part = (i+1)
  526.         MM_WriteStem system.tempfile 'TextStem.'||i
  527.         if (rc~=0) then ByeBye('100,;***Error: Unable to write tempfile !!')
  528.         call Build_MessageBody(system.text.sendtext||',;'||system.tempfile||',;'||system.tempfile)
  529.         call Send_Msg(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'system.tempfile||',;'system.subj.sendtext)
  530.         MM_DeleteFile system.tempfile
  531.     end
  532.  
  533. return
  534.  
  535.  
  536.  
  537. Send_FileNotFound: procedure expose system.
  538.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail ',;' filename
  539.     system.info.prc.fname = filename
  540.     call Log('-> File not found: '||filename||'.')
  541.     call Build_MessageBody(system.text.filenotfound||',;'||system.tempfile)
  542.     call Send_Msg(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'system.tempfile',;'system.subj.filenotfound)
  543.     MM_DeleteFile system.tempfile
  544. return
  545.  
  546.  
  547.  
  548. Send_The_ReadMe: procedure expose system.
  549.     parse arg To_Area ',;' To_Name ',;' To_Addr ',;' To_EMail ',;' filename
  550.     readme = Get_ReadMe( filename )
  551.     system.info.prc.part = 0
  552.     call Build_MessageBody(system.text.sendreadme||',;'||system.tempfile||',;'||readme)
  553.     call Send_Msg(To_Area',;'To_Name',;'To_Addr',;'To_EMail',;'system.tempfile',;'system.subj.sendreadme)
  554.     MM_DeleteFile system.tempfile
  555. return
  556.  
  557.  
  558.  
  559. Check_Passwords: procedure expose system. ToDoList.
  560.     call Log()
  561.     call Log('Password check.,;,;+')
  562.     MM_ReadStem system.passwdfile 'DummyStem'
  563.     PasswdStem.count=0
  564.     do i=0 to DummyStem.count-1
  565.         parse var DummyStem.i one '|' two '|' three
  566.         if (one~='') then do
  567.             x=PasswdStem.count
  568.             PasswdStem.x.name  = one
  569.             PasswdStem.x.pass  = two
  570.             PasswdStem.x.level = three
  571.             PasswdStem.count = x+1
  572.         end
  573.     end
  574.     do todo=0 to ToDoList.count-1
  575.         if (TodoList.todo.email~='') then who=ToDoList.todo.email||' ('ToDoList.todo.MsgFrom||')'
  576.         else who=ToDoList.todo.MsgFrom||' ('ToDoList.todo.MsgFromAddr||')'
  577.         if (ToDoList.todo.MsgSubj~='') then do
  578.             checked=0
  579.             do i=0 to PasswdStem.count-1
  580.                 if ((upper(ToDoList.todo.MsgFrom)=upper(PasswdStem.i.name))&(upper(ToDoList.todo.MsgSubj)=upper(PasswdStem.i.pass))) then do
  581.                     checked=1
  582.                     ToDoList.todo.Level = PasswdStem.i.level
  583.                      i = PasswdStem.count
  584.                 end
  585.             end
  586.             if (checked=0) then do
  587.                 MM_ReadMsg ToDoList.todo.MsgArea ToDoList.todo.MsgNum 'MsgStem'
  588.                 if (rc~=0) then call ByeBye('100,;***Error: Unable to read message !')
  589.                 system.info.Area        = ToDoList.todo.MsgArea
  590.                 system.info.Number      = ToDoList.todo.MsgNum
  591.                 system.info.From        = ToDoList.todo.MsgFrom
  592.                 system.info.FromAddr    = ToDoList.todo.MsgFromAddr
  593.                 system.info.To          = MsgStem.TO
  594.                 system.info.ToAddr      = MsgStem.TOADDR
  595.                 system.info.Subject     = MsgStem.SUBJ
  596.                 system.info.Date        = MsgStem.DATE
  597.                 system.info.Flags       = MsgStem.FLAGS
  598.                 system.info.Level       = ToDoList.todo.Level
  599.                 system.info.EMail       = ToDoList.todo.EMail
  600.                 system.info.fromwho         = who
  601.                 MM_WriteStem system.tempfile 'MsgStem.TEXT'
  602.                 call Log('-> !!! WRONG PASSWORD for '||who||' !!!! (PW: "'||ToDoList.todo.MsgSubj||'"),;2,;!')
  603.                 call Build_MessageBody(system.text.wrongpass||',;'||system.tempfile||',;'||system.tempfile)
  604.                 call Send_Msg(ToDoList.todo.MsgArea',;'ToDoList.todo.MsgFrom',;'ToDoList.todo.MsgFromAddr',;'ToDoList.todo.EMail',;'system.tempfile',;'system.subj.wrongpass)
  605.                 MM_DeleteFile system.tempfile
  606.                 ToDoList.todo.Level = -1
  607.             end
  608.             else call Log('-> User '||who||' identified. (Level '||ToDoList.todo.Level||'.)')
  609.         end
  610.     end
  611. return
  612.  
  613.  
  614.  
  615.  
  616. /*---------------------------------------------------------------------------*\
  617. |*  Index   Functions:                                                       *|
  618. \*---------------------------------------------------------------------------*/
  619.  
  620.  
  621. Read_Index: procedure expose system.indexfile IndexStem.
  622.     IndexStem.count = 0
  623.     MM_ReadStem system.indexfile 'DummyStem'
  624.     MM_SortStem 'DummyStem'
  625.     do i=0 to DummyStem.count-1
  626.         parse var DummyStem.i group '|' name '|' type '|' path '|' size '|' level '|' desc
  627.         if (group~='') then do
  628.             j = IndexStem.count
  629.             IndexStem.j.fgroup  = group
  630.             IndexStem.j.ftype   = type
  631.             IndexStem.j.fname   = name
  632.             IndexStem.j.fpath   = path
  633.             IndexStem.j.fsize   = size
  634.             IndexStem.j.flevel  = level
  635.             IndexStem.j.fdesc   = desc
  636.             IndexStem.count = IndexStem.count+1
  637.         end
  638.     end
  639. return
  640.  
  641.  
  642. Scan_Index: procedure expose IndexStem. FileStem.
  643.     parse arg pattern ',;' level
  644.     FileStem.count=0
  645.     do i=0 to IndexStem.count
  646.         if ((upper(pattern)=upper(IndexStem.i.fname))&(IndexStem.i.flevel<=level)) then do
  647.             j = FileStem.count
  648.             FileStem.j.fgroup = IndexStem.i.fgroup
  649.             FileStem.j.ftype  = IndexStem.i.ftype
  650.             FileStem.j.fname  = IndexStem.i.fname
  651.             FileStem.j.fpath  = IndexStem.i.fpath
  652.             FileStem.j.fsize  = IndexStem.i.fsize
  653.             FileStem.j.flevel = IndexStem.i.flevel
  654.             FileStem.j.fdesc  = IndexStem.i.fdesc
  655.             FileStem.count = j+1
  656.         end
  657.     end
  658. return
  659.  
  660.  
  661. Check_Pattern: procedure
  662.     parse arg In.0 ',;' pattern
  663.     In.count=1; Out.count=0
  664.     pattern = '"'||pattern||'"'
  665.     MM_SearchInStem 'In' 'Out' pattern 'NUM'
  666. return Out.count
  667.  
  668.  
  669. Search_Index: procedure expose IndexStem. FileStem.
  670.     parse arg pattern ',;' level
  671.     FileStem.count=0
  672.     do i=0 to IndexStem.count
  673.         if (((Check_Pattern(IndexStem.i.fname||',;'||pattern)~=0)|(Check_Pattern(IndexStem.i.fdesc||',;'||pattern)~=0))&(IndexStem.i.flevel<=level)) then do
  674.             j = FileStem.count
  675.             FileStem.j.fgroup = IndexStem.i.fgroup
  676.             FileStem.j.ftype  = IndexStem.i.ftype
  677.             FileStem.j.fname  = IndexStem.i.fname
  678.             FileStem.j.fpath  = IndexStem.i.fpath
  679.             FileStem.j.fsize  = IndexStem.i.fsize
  680.             FileStem.j.flevel = IndexStem.i.flevel
  681.             FileStem.j.fdesc  = IndexStem.i.fdesc
  682.             FileStem.count = j+1
  683.         end
  684.     end
  685. return
  686.  
  687.  
  688.  
  689.  
  690. /*---------------------------------------------------------------------------*\
  691. |*  Other Functions:                                                         *|
  692. \*---------------------------------------------------------------------------*/
  693.  
  694.  
  695.  
  696. Check_FileStem_Dupes: procedure expose FileStem.
  697.     do i=0 to FileStem.count-2
  698.         do j=(i+1) to FileStem.count-1
  699.             if  ((upper(FileStem.i.fpath)=upper(FileStem.j.fpath))&(upper(FileStem.i.ftype)=upper(FileStem.j.ftype))) then do
  700.                 do k=j to FileStem.count-2
  701.                     l = k+1
  702.                     FileStem.k.ftype  = FileStem.l.ftype
  703.                     FileStem.k.fname  = FileStem.l.fname
  704.                     FileStem.k.fpath  = FileStem.l.fpath
  705.                     FileStem.k.flevel = FileStem.l.flevel
  706.                     FileStem.k.fdesc  = FileStem.l.fdesc
  707.                 end
  708.                 k=FileStem.count-1
  709.                 FileStem.k.fpath=''
  710.                 FileStem.count = k
  711.                 j=j-1
  712.             end
  713.         end
  714.     end
  715. return
  716.  
  717.  
  718.  
  719.  
  720.  
  721. /*---------------------------------------------------------------------------*\
  722. |*  Replace & Send Functions :                                               *|
  723. \*---------------------------------------------------------------------------*/
  724.  
  725.  
  726. Send_Msg: procedure expose system.
  727.     parse arg inarea ',;' to_name ',;' to_addr ',;' to_email ',;' iofile ',;' subject
  728.     subject = Replace_My_Patterns(subject)
  729.     if (to_email~='') then do
  730.         TextStem.count=0
  731.         TextStem.0 = 'To: '||to_email
  732.         Textstem.1 = ''
  733.         TextStem.count = 2
  734.         MM_ReadStem iofile 'TextStem' 'APPEND'
  735.         if (rc~=0) then ByeBye('100,;***Error: Unable to read iofile !!')
  736.         MM_WriteStem system.tempfile||',send' 'TextStem'
  737.         if (rc~=0) then ByeBye('100,;***Error: Unable to write tempfile !!')
  738.         NewMsgStem.FILE = system.tempfile||',send'
  739.     end
  740.     else do
  741.         NewMsgStem.FILE = iofile
  742.     end
  743.     NewMsgStem.FROM     = WORD(system.servername,1)
  744.     NewMsgStem.FROMADDR = ''
  745.     NewMsgStem.TO       = to_name
  746.     NewMsgStem.TOADDR   = to_addr
  747.     NewMsgStem.SUBJ     = subject
  748.     NewMsgStem.FLAGS    = system.cfg.flags
  749.     NewMsgStem.TEAR     = '" & FbMRManager"'
  750.     MM_WriteMsg inarea 'NewMsgStem'
  751.     if (rc~=0) then ByeBye('100,;***Error: Unable to send message !!')
  752.     if (to_email~='') then do
  753.         MM_DeleteFile system.tempfile||',send'
  754.         if (rc~=0) then ByeBye('100,;***Error: Unable to delete tempfile !!')
  755.     end
  756. return
  757.  
  758.  
  759.  
  760.  
  761. Replace_String: procedure
  762.     parse arg string ',;' rep ',;' by
  763.     do while (pos(rep,string)~=0)
  764.         interpret "parse var string pre '"rep"' post"
  765.         string = pre||by||post
  766.     end
  767. return string
  768.  
  769.  
  770.  
  771.  
  772. Replace_My_Patterns: procedure expose system.
  773.  
  774.     parse arg string
  775.  
  776.     string = Replace_String(string||',;'|| '{SERVER}'   ||',;'||    word(system.servername,1)   )
  777.     string = Replace_String(string||',;'|| '{SYSOP}'    ||',;'||    system.sysopname            )
  778.  
  779.     string = Replace_String(string||',;'|| '{PRGID}'    ||',;'||    system.prg.id               )
  780.     string = Replace_String(string||',;'|| '{PRGNAME}'  ||',;'||    system.prg.name             )
  781.     string = Replace_String(string||',;'|| '{PRGVER}'   ||',;'||    system.prg.ver              )
  782.  
  783.     string = Replace_String(string||',;'|| '{FROM}'     ||',;'||    system.info.From            )
  784.     string = Replace_String(string||',;'|| '{FROMNICK}' ||',;'||    word(system.info.From,1)    )
  785.     string = Replace_String(string||',;'|| '{FROMADDR}' ||',;'||    system.info.FromAddr        )
  786.     string = Replace_String(string||',;'|| '{FROMWHO}'  ||',;'||    system.info.fromwho             )
  787.     string = Replace_String(string||',;'|| '{EMAIL}'    ||',;'||    system.info.EMail           )
  788.     string = Replace_String(string||',;'|| '{LEVEL}'    ||',;'||    system.info.Level           )
  789.  
  790.     string = Replace_String(string||',;'|| '{TO}'       ||',;'||    system.info.To              )
  791.     string = Replace_String(string||',;'|| '{TOADDR}'   ||',;'||    system.info.ToAddr          )
  792.  
  793.     string = Replace_String(string||',;'|| '{MSGSUBJ}'  ||',;'||    system.info.Subject         )
  794.     string = Replace_String(string||',;'|| '{MSGDATE}'  ||',;'||    system.info.Date            )
  795.     string = Replace_String(string||',;'|| '{MSGFLAGS}' ||',;'||    system.info.Flags           )
  796.     string = Replace_String(string||',;'|| '{MSGAREA}'  ||',;'||    system.info.Area            )
  797.     string = Replace_String(string||',;'|| '{MSGNUM}'   ||',;'||    system.info.Number          )
  798.  
  799.     string = Replace_String(string||',;'|| '{FGROUP}'   ||',;'||    system.info.prc.fgroup      )
  800.     string = Replace_String(string||',;'|| '{FNAME}'    ||',;'||    system.info.prc.fname       )
  801.     string = Replace_String(string||',;'|| '{FTYPE}'    ||',;'||    system.info.prc.ftype       )
  802.     string = Replace_String(string||',;'|| '{FPATH}'    ||',;'||    system.info.prc.fpath       )
  803.     string = Replace_String(string||',;'|| '{FSIZE}'    ||',;'||    system.info.prc.fsize       )
  804.     string = Replace_String(string||',;'|| '{FLEVEL}'   ||',;'||    system.info.prc.flevel      )
  805.     string = Replace_String(string||',;'|| '{FDESC}'    ||',;'||    system.info.prc.fdesc       )
  806.     string = Replace_String(string||',;'|| '{FPART}'    ||',;'||    system.info.prc.part        )
  807.     string = Replace_String(string||',;'|| '{FMAXPART}' ||',;'||    system.info.prc.maxpart     )
  808.  
  809. return string
  810.  
  811.  
  812.  
  813. Build_MessageBody: procedure expose system.
  814.     parse arg infile ',;' outfile ',;' textfile
  815.  
  816.     Text.         = 0
  817.     Text.count    = 0
  818.     NewText.      = 0
  819.     NewText.count = 0
  820.  
  821.     MM_ReadStem infile 'Text'
  822.     if (rc~=0) then ByeBye('100,;***Error: Unable to read inputfile "'||infile||'" !!')
  823.     do i=0 to Text.count-1
  824.         Text.i = Replace_My_Patterns(Text.i)
  825.     end
  826.     do i=0 to Text.count-1
  827.         if (word(Text.i,1)='{TEXT}') then do
  828.             if (textfile~='') then do
  829.                 MM_ReadStem textfile 'NewText' 'APPEND'
  830.                 if (rc~=0) then ByeBye('100,;***Error: Unable to read textfile "'||textfile||'" !!')
  831.             end
  832.         end
  833.         else do
  834.             MM_AddToStem 'NewText' 'Text.'i
  835.         end
  836.     end
  837.     MM_WriteStem outfile 'NewText'
  838.     if (rc~=0) then ByeBye('100,;***Error: Unable to write outputfile "'||outfile||'" !!')
  839. return
  840.  
  841.  
  842. Strip_Extension: procedure
  843.     parse arg string
  844. return Left( string, (LastPos( '.', string) - 1) )
  845.  
  846. Get_ReadMe: procedure
  847.     parse arg string
  848.     string = Strip_Extension(string)||'.readme'
  849.     if (exists(string)=0) then string = ''
  850. return string
  851.  
  852.  
  853.  
  854. /*-----------------------------------------------------------------------*/
  855. /* Read Config:                                                          */
  856. /*-----------------------------------------------------------------------*/
  857.  
  858. Read_Config: procedure expose system.
  859.  
  860.     dummy.count=0
  861.     MM_ReadStem system.configfile 'dummy'
  862.     if dummy.count=0 then ByeBye('200,;***Error: Config file not found !')
  863.  
  864.     do x=0 to dummy.count-1
  865.         parse var dummy.x pre '#' keyword ' ' inhalt
  866.         if (pre='') & (keyword~='') then do
  867.             select
  868.                 when (keyword='SERVERNAME')         then system.servername          = inhalt
  869.                 when (keyword='SYSOPNAME')          then system.sysopname           = inhalt
  870.                 when (keyword='UUENCODE')           then system.uuencode            = inhalt
  871.                 when (keyword='TEMPFILE')           then system.tempfile            = inhalt
  872.                 when (keyword='INDEXFILE')          then system.indexfile           = inhalt
  873.                 when (keyword='PASSWDFILE')         then system.passwdfile          = inhalt
  874.  
  875.                 when (keyword='TEXT_HELPFILE')      then system.text.helpfile       = inhalt
  876.                 when (keyword='TEXT_FILENOTFOUND')  then system.text.filenotfound   = inhalt
  877.                 when (keyword='TEXT_WRONGPASS')     then system.text.wrongpass      = inhalt
  878.                 when (keyword='TEXT_FILELIST')      then system.text.filelist       = inhalt
  879.                 when (keyword='TEXT_SENDREADME')    then system.text.sendreadme     = inhalt
  880.                 when (keyword='TEXT_SENDFILE')      then system.text.sendfile       = inhalt
  881.                 when (keyword='TEXT_SENDTEXT')      then system.text.sendtext       = inhalt
  882.                 when (keyword='TEXT_SENDSCAN')      then system.text.search         = inhalt
  883.                 when (keyword='TEXT_SENDHOLD')      then system.text.hold           = inhalt
  884.  
  885.                 when (keyword='SUBJ_HELPFILE')      then system.subj.helpfile       = inhalt
  886.                 when (keyword='SUBJ_FILENOTFOUND')  then system.subj.filenotfound   = inhalt
  887.                 when (keyword='SUBJ_WRONGPASS')     then system.subj.wrongpass      = inhalt
  888.                 when (keyword='SUBJ_FILELIST')      then system.subj.filelist       = inhalt
  889.                 when (keyword='SUBJ_SENDREADME')    then system.subj.sendreadme     = inhalt
  890.                 when (keyword='SUBJ_SENDFILE')      then system.subj.sendfile       = inhalt
  891.                 when (keyword='SUBJ_SENDTEXT')      then system.subj.sendtext       = inhalt
  892.                 when (keyword='SUBJ_SENDSCAN')      then system.subj.search         = inhalt
  893.                 when (keyword='SUBJ_SENDHOLD')      then system.subj.hold           = inhalt
  894.  
  895.                 when (keyword='SEARCHFLAGS')        then system.cfg.sflags          = inhalt
  896.                 when (keyword='STDFLAGS')           then system.cfg.flags           = inhalt
  897.                 when (keyword='STDLEVEL')           then system.cfg.stdlevel        = inhalt
  898.                 when (keyword='HOLDLEVEL')          then system.cfg.holdlevel       = inhalt
  899.                 when (keyword='DONEFLAGS')          then system.cfg.doneflags       = inhalt
  900.                 when (keyword='MAXTXTSIZE')         then system.cfg.txtmaxsize      = inhalt
  901.                 when (keyword='MAXFILESIZE')        then system.cfg.binmaxsize      = inhalt
  902.                 otherwise nope
  903.             end
  904.         end
  905.     end
  906. return
  907.  
  908.  
  909.  
  910.  
  911.  
  912. /* End of file.
  913. ============================================================================*/
  914.